class User < ActiveRecord::Base
    
    has_many :microposts, dependent: :destroy
    has_many :active_relationships, class_name: "Relationship",
                                    foreign_key: "follower_id",
                                    dependent: :destroy
    has_many :passive_relationships, class_name: "Relationship",
                                     foreign_key: "followed_id",
                                     dependent: :destroy
    has_many :following, through: :active_relationships, source: :followed
    has_many :followers, through: :passive_relationships, source: :follower

    attr_accessor :remember_token, :activation_token, :reset_token
	before_save :downcase_email
    before_create :create_activation_digest

	validates :name, presence: true, length: { maximum: 50 }
	VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
	validates :email, presence: true, length: { maximum: 255 },
	                  format: { with: VALID_EMAIL_REGEX },
	                  uniqueness: { case_sensitive: false }
	has_secure_password
	validates :password, length: { minimum: 6 }, allow_blank: true
    
	# 返回指定字符串的哈希摘要
	def User.digest(string)
		cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST :
		                                              BCrypt::Engine.cost
		BCrypt::Password.create(string, cost: cost)
	end

	# 返回一个随机令牌
	def User.new_token
		SecureRandom.urlsafe_base64
	end

	def remember
		self.remember_token = User.new_token
		update_attribute(:remember_digest, User.digest(remember_token))
	end

	def authenticated?(attribute, token)
		digest = send("#{attribute}_digest")
		return false if digest.nil?
		BCrypt::Password.new(digest).is_password?(token)
	end
    
    # 忘记用户
	def forget
		update_attribute(:remember_digest, nil)
	end

	# 激活账号
	def activate
		update_attribute(:activated, true)
		update_attribute(:activated_at, Time.zone.now)
	end

	# 发送激活邮件
	def send_activation_email
		UserMailer.account_activation(self).deliver_now
	end
 
    # 设置密码重设的相关属性
	def create_reset_digest
		self.reset_token = User.new_token
        update_attribute(:reset_digest, User.digest(reset_token))
        update_attribute(:reset_sent_at, Time.zone.now)
	end

	# 发送重设密码邮件
	def send_password_reset_email
		UserMailer.password_reset(self).deliver_now
	end

	# 如果密码重设超时失效了，返回true
	def password_reset_expired?
		reset_sent_at < 2.hours.ago
	end

	def feed
		following_ids = "SELECT followed_id FROM Relationships WHERE follower_id = :user_id"
		Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
	end

    # 关注一个用户
	def follow(other_user)
		active_relationships.create(followed_id: other_user.id)
	end

	# 取消关注一个用户
	def unfollow(other_user)
		active_relationships.find_by(followed_id: other_user.id).destroy
	end

	# 判断一个用户是否关注了另一个用户，是返回true
	def following?(other_user)
		following.include?(other_user)
	end

	private
	  
	  def downcase_email
	  	self.email = email.downcase
	  end

      def create_activation_digest
      	self.activation_token = User.new_token
      	self.activation_digest = User.digest(activation_token)
      end
end
